package tp.pr5.mv;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

import tp.pr5.mv.asmexcep.ASMSyntaxErrorException;

public class ASMLoader {
	
	public static ProgramMV loadASMFile(String file) throws ASMSyntaxErrorException, java.io.IOException, FileNotFoundException  {
		
		/* Método estático que carga un archivo ASM a través de una cadena de caracteres 
		devolviendo un programa de la maquina virtual */
		
		ProgramMV program = new ProgramMV();
		
		FileReader fr =  new FileReader (file); 
		BufferedReader br = new BufferedReader(fr);
		

         Instruction ins;
         String line;
    
         while(  ( line=br.readLine() ) != null  ) // Vamos leyendo líneas hasta llegar al final del stream (devolverá null)
         {
        	 
        	 if ( !line.equals("")  &&  line.charAt(0) !=  ';' )    // Si la línea no es vacía y el comentario no "cubre" toda la línea...
        	 {
        		 
					line = commentFilter(line);
					ins = InstructionParser.parse(line); // Parseamos la línea ya sin comentarios
					if ( ins != null) 
						program.addInstruction(ins); 
					else { // Lanzamos la excepción si devuelve null
						br.close();
						throw new ASMSyntaxErrorException("Error en el programa. Linea: " + line);
					}
				
        	 }
        	 
         }
		
         br.close();
         
		return program;
		
	}
	
	public static String commentFilter(String line) { // Realiza un filtrado de los comentarios. Dada una linea devuelve la linea sin comentarios
		
		 if ( line.contains(";")  ) 
		 {	
				int i = 0;
				while ( line.charAt(i) != ';'  ) i++; // Recorremos la linea buscando el inicio del comentario y devolvemos la subcadena
				String s = line.substring(0, i);
				return s;
		 }
		 else
			 return line;   // Si la linea no tiene comentarios entonces pasamos directamente la línea
	}
}
